package com.br.planningrun.repositorio;

import java.util.ArrayList;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteStatement;

import com.br.planningrun.entidade.Usuario;

public class RepositorioUsuario {
	// Atributos
	private Context context;
	private SQLiteDatabase db2 = null;
	private SQLiteStatement stmt = null;
	private Cursor c = null;
	
	private static final String NOME_TABELA = "tb_usuario";
	private static final String BANCO = "planningrun";

	// Construtor
	public RepositorioUsuario(Context context) {
		this.context = context;
	}
	
	public int getMaxId() {
		int retorno = 0;
		try {
			db2 = context.openOrCreateDatabase(BANCO, 0, null);
			c = db2.rawQuery("SELECT MAX(codigo) as maximo FROM " + NOME_TABELA + ";",
					null);

			c.moveToNext();
			retorno = c.getInt(c.getColumnIndex("maximo"));
			
    	} finally {
    		if (stmt != null) {
        		stmt.close();
        	}
        	
        	if (c != null) {
        		c.close();
        	}
        	
        	if (db2 != null) {
        		db2.close();
        	}
    	}
		
		return retorno;

	}

	// Inserir objeto 
	public void inserir(Usuario usuario) {
		try {
			db2 = context.openOrCreateDatabase(BANCO, 0, null);

			stmt = db2.compileStatement("INSERT INTO " 
					+ NOME_TABELA + " (codigo, nome, login, senha) "
					+ "VALUES (?, ?, ?, ?);");

			stmt.bindLong(1, usuario.getCodigo());
			stmt.bindString(2, usuario.getNome());
			stmt.bindString(3, usuario.getLogin());
			stmt.bindString(4, usuario.getSenha());

			stmt.execute();
    	} finally {
    		if (stmt != null) {
        		stmt.close();
        	}
        	
        	if (c != null) {
        		c.close();
        	}
        	
        	if (db2 != null) {
        		db2.close();
        	}
    	}
	}

	// Atualizacao do objeto
	public void atualizar(Usuario usuario) {
		try {
			db2 = context.openOrCreateDatabase(BANCO, 0, null);

			stmt = db2.compileStatement("UPDATE " + NOME_TABELA 
					+ " SET " + "nome = ?, login = ?, senha = ?"
					+ " WHERE codigo = ?;");

			stmt.bindString(1, usuario.getNome());
			stmt.bindString(2, usuario.getLogin());
			stmt.bindString(3, usuario.getSenha());
			stmt.bindLong(4, usuario.getCodigo());

			stmt.execute();
    	} finally {
    		if (stmt != null) {
        		stmt.close();
        	}
        	
        	if (c != null) {
        		c.close();
        	}
        	
        	if (db2 != null) {
        		db2.close();
        	}
    	}
	}

	// Remover objeto (CODIGO)
	public void remover(int codigo) {
		try {
			db2 = context.openOrCreateDatabase(BANCO, 0, null);

			stmt = db2.compileStatement("DELETE FROM " 
					+ NOME_TABELA + " WHERE codigo = ?;");

			stmt.bindLong(1, codigo);

			stmt.execute();
    	} finally {
    		if (stmt != null) {
        		stmt.close();
        	}
        	
        	if (c != null) {
        		c.close();
        	}
        	
        	if (db2 != null) {
        		db2.close();
        	}
    	}
	}

	// Remover objeto (WHERE)
	public void remover(String where) {
		try {
			db2 = context.openOrCreateDatabase(BANCO, 0, null);

			stmt = db2.compileStatement("DELETE FROM " 
					+ NOME_TABELA + " " + where);

			stmt.execute();
    	} finally {
    		if (stmt != null) {
        		stmt.close();
        	}
        	
        	if (c != null) {
        		c.close();
        	}
        	
        	if (db2 != null) {
        		db2.close();
        	}
    	}
	}

	// Consulta do objeto (CODIGO)
	public Usuario procurar(int codigo) {
		ArrayList<Usuario> lista = this.listar(" WHERE codigo = " + codigo);
		Usuario usuario = null;
		if (lista.size() > 0) {
			usuario = lista.get(0);
		}
		return usuario;
	}

//	// Consulta do objeto (OBJETO)
//	public Usuario procurar(Usuario usuario) {
//		// Cria o where a partir do objeto
//		String where = "";
//		
//		// Verifica se existe codigo para where
//		if (usuario.getCodigo() != -1) {
//			if (where.equals("")) {
//				where = " WHERE codigo = ?";
//			} else {
//				where = where + " AND codigo = ?";
//			}
//		}
//		
//		// Verifica se existe nome para where
//		if (usuario.getNome().equals("")) {
//			if (where.equals("")) {
//				where = " WHERE nome = ?";
//			} else {
//				where = where + " AND nome = ?";
//			}
//		}
//		
//		// Verifica se existe login para where
//		if (usuario.getLogin().equals("")) {
//			if (where.equals("")) {
//				where = " WHERE login = ?";
//			} else {
//				where = where + " AND login = ?";
//			}
//		}
//		
//		// Verifica se existe senha para where
//		if (usuario.getSenha().equals("")) {
//			if (where.equals("")) {
//				where = " WHERE senha = ?";
//			} else {
//				where = where + " AND senha = ?";
//			}
//		}
//
//		ArrayList<Usuario> lista = this.listar(" WHERE codigo = " + codigo);
//		Usuario usuario = null;
//		if (lista.size() > 0) {
//			usuario = lista.get(0);
//		}
//		return usuario;
//	}

	// Listagem dos objetos
	public ArrayList<Usuario> listar(String where) {
		ArrayList<Usuario> lista = new ArrayList<Usuario>();
		
		try {
			db2 = context.openOrCreateDatabase(BANCO, 0, null);
			c = db2.rawQuery("SELECT * FROM " + NOME_TABELA + " " + where + ";",
					null);

			while (c.moveToNext()) {
				Usuario usuario = new Usuario();
				usuario.setCodigo(c.getInt(c.getColumnIndex("codigo")));
				usuario.setNome(c.getString(c.getColumnIndex("nome")));
				usuario.setLogin(c.getString(c.getColumnIndex("login")));
				usuario.setSenha(c.getString(c.getColumnIndex("senha")));
				lista.add(usuario);
			}
    	} finally {
    		if (stmt != null) {
        		stmt.close();
        	}
        	
        	if (c != null) {
        		c.close();
        	}
        	
        	if (db2 != null) {
        		db2.close();
        	}
    	}

		return lista;
	}

	// Criacao da tabela
	public void truncate() {
		try {
			db2 = context.openOrCreateDatabase(BANCO, 0, null);
			// Exclusao da tabela se existir
			db2.execSQL("DROP TABLE IF EXISTS " + NOME_TABELA);
			// Criacao da tabela
			db2.execSQL("CREATE TABLE IF NOT EXISTS " + NOME_TABELA + "( codigo INTEGER NOT NULL PRIMARY KEY,"
					+ "nome varchar2(255),"
					+ "login varchar2(255),"
					+ "senha varchar2(255)" 
					+ ");");
    	} finally {
    		if (stmt != null) {
        		stmt.close();
        	}
        	
        	if (c != null) {
        		c.close();
        	}
        	
        	if (db2 != null) {
        		db2.close();
        	}
    	}
	}
}
